package cn.com.greatwall.system.modules.system.repository;

import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import cn.com.greatwall.system.modules.system.domain.Menu;

/**
 * @Author herw
 * @Time 2020-06-29 12:37:53 PM
 * @Version 1.0
 * @Description:
 */
public interface MenuRepository extends JpaRepository<Menu, Long>, JpaSpecificationExecutor<Menu> {
    /**
     * 根据菜单标题查询
     * 
     * @param title 菜单标题
     * @return /
     */
    Menu findByTitle(String title);

    /**
     * 根据组件名称查询
     * 
     * @param name 组件名称
     * @return /
     */
    Menu findByComponentName(String name);

    /**
     * 根据菜单的 PID 查询
     * 
     * @param pid /
     * @return /
     */
    List<Menu> findByPid(long pid);

    /**
     * 查询顶级菜单
     * 
     * @return /
     */
    List<Menu> findByPidIsNull();

    /**
     * 根据角色ID与菜单类型查询菜单
     * 
     * @param roleIds roleIDs
     * @param type    类型
     * @return /
     */
    @Query(value = "select m.* from sys_menu m, sys_roles_menus r where "
            + "m.menu_id = r.menu_id and r.role_id in ?1 and type != ?2 order by m.menu_sort asc", nativeQuery = true)
    LinkedHashSet<Menu> findByRoleIdsAndTypeNot(Set<Long> roleIds, int type);

    /**
     * 获取节点数量
     * 
     * @param id /
     * @return /
     */
    int countByPid(Long id);

    /**
     * 更新节点数目
     * 
     * @param count  /
     * @param menuId /
     */
    @Modifying
    @Query(value = "update sys_menu set sub_count =?1 where menu_id =?2", nativeQuery = true)
    void updateSubCntById(int count, Long menuId);
}
